package com.cy.pj.module.controller;

import com.cy.pj.module.pojo.ResponseResult;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;


/**
 *  在这个Controller中 演示 如何将对象转换为json格式字符串, 然后响应到客户端
 *
 *  思考: 为什么要将数据转换为json格式字符串
 *   1) json是一种轻量级的数据格式:{key : value, key : value}  轻量级: 提取数据的速度高于xml
 *   2) json这种数据格式非常适合跨端应用(不同的移动设备间的数据传输)
 */


@RestController
//@Controller
public class JsonObjectController {

//    @ResponseBody   //说明该方法返回的不是一个具体的页面,  当类中全是这种方法,  可以在类上添加@RestController
    @RequestMapping("/doConvertResponseToJson")
    //方法的返回值不再是一个view, 会将响应结果转换为json格式字符串,然后写入到HTTP响应体中
    public ResponseResult doJsonObjectController() throws JsonProcessingException {

        ResponseResult rr = new ResponseResult();

        rr.setCode(200);
        rr.setMessage("update OK");
//        调用该方法, 可以将对象转化为json字符串
        System.out.println(new ObjectMapper().writeValueAsString(rr));
        return rr;
    }/*方法的返回值是一个POJO对象, 框架帮我们将 对象 转换为 json格式字符串*/


//    @ResponseBody
    @RequestMapping("/doConvertMapToJson")
    public Map<String,Object> doConvertMapToJson(){
        Map<String,Object> map=new HashMap<>();
        map.put("username","刘德华");
        map.put("state",true);
        return map;
    }/*方法的返回值是一个Map对象, 框架帮我们将 对象 转换为 json格式字符串*/


//    上面两种方法的底层实现方法
//    @ResponseBody
    /* 该方法是上述两种方法的底层实现方法, 通过调用response对象来设置输入内容 */
    @RequestMapping("/doPrintJSON")
    public void doPrint(HttpServletResponse response)throws Exception{
        Map<String,Object> map=new HashMap<>();
        map.put("username","刘德华是真的帅");
        map.put("state",true);
        //将map中的数据转换为json格式字符串
        String jsonStr = new ObjectMapper().writeValueAsString(map);

//        System.out.println("jsonStr="+jsonStr);

        //将字符串响应到客户端
        //设置响应数据的编码
        response.setCharacterEncoding("utf-8");
        //告诉客户端,要向它响应的数据类型为text/html,编码为utf-8.请以这种编码进行数据呈现
        response.setContentType("text/html;charset=utf-8");/*设置响应到客户端的内容类型, 以及响应时的编码类型*/
        response.getWriter().println(jsonStr);
    }


}
